
package GUI;
import Inference.Inferencia;
import Inference.Regras;
import Inference.Fatos;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
/**
 * Interface do terminal onde o usuário monta as regras para a realização de inferencia
 * @author Plínio
 */
public class GUI_InferenceTerminal extends JDialog implements ActionListener{
private Inferencia moduloInferencia;
    private JButton btAtributos;
    private JPanel pnlTodo;
    private final JPanel pnlInferior;
    private final JPanel pnlSuperior;
    private final JPanel pnlCentral;
    //private final JTextPane txtPane1;
    private String strFatos;
    private String[] fatosSeparados;
    private String[] nomesFatos;
    private final JButton btnProsseguir;
    private ArrayList<JRadioButton> fatosChave;
    private String chaveEscolhida;
    private String fatoBase2v1,fatoBase2v2,fatoBase1v1,fatoBase1v2;
    private String fatoBase2,fatoBase1,functorRegraBase;
    String existeModificado = new String(); //regra base usada no operador novo_elemento e elemento_excluido
    String existeBase = new String(); //regra base usada no operador novo_elemento e elemento_excluido
    
    private final JLabel lblEscolhaChave;
    

    private javax.swing.JButton btnFinalizar, btnAddRegra;
    private javax.swing.JTextField campoNomeRegra;
    private javax.swing.JComboBox comboOperador1;
    private javax.swing.JComboBox comboSaida;
    private javax.swing.JComboBox comboTermo1;
    private javax.swing.JComboBox comboTermo2;
    private javax.swing.JComboBox comboTermo3;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JSeparator jSeparator1;
    private boolean terminalSetado;
    private javax.swing.JLabel jLabel5;
    private JScrollPane pn;
    

public GUI_InferenceTerminal(Inferencia moduloInferencia) {
    setModal(true);
    this.moduloInferencia = moduloInferencia;
    pnlTodo = new JPanel(new BorderLayout());
    Font fonte = new Font("Arial", 1, 16);
    terminalSetado=false;
   // txtPane1 = new JTextPane();
   // txtPane1.setText("");
   // txtPane1.setToolTipText("Crie ou selecione um arquivo que contenha as regras Prolog do contexto desejado.");
   // txtPane1.setFont(new Font("Arial", Font.PLAIN, 14));
        btnProsseguir = new JButton("Prosseguir");
        btnProsseguir.addActionListener(this);
        btnProsseguir.setVisible(false);    
   //   txtPane1.setPreferredSize(new Dimension(500, 300));
   //   JScrollPane scrlPane = new JScrollPane(txtPane1);
        pnlInferior = new JPanel(new FlowLayout());
        pnlSuperior = new JPanel(new FlowLayout());
        pnlCentral = new JPanel(new FlowLayout());
   //   pnlCentral.add(scrlPane);
        lblEscolhaChave = new JLabel();
        lblEscolhaChave.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        lblEscolhaChave.setForeground(new java.awt.Color(0, 0, 153));
        lblEscolhaChave.setText("Defina o atributo chave do contexto");
        
        btAtributos = new JButton("Listar Atributos");
        btAtributos.addActionListener(this);
        btnFinalizar = new javax.swing.JButton();
        btnFinalizar.setIcon(new ImageIcon(getClass().getResource("/imagens/iconeDone.png")));
        btnFinalizar.addActionListener(this);        
        btnAddRegra = new javax.swing.JButton();  
        btnAddRegra.setIcon(new ImageIcon(getClass().getResource("/imagens/iconeAdd.png")));
        //getClass().getResource("/imagens/iconePasta2.PNG"))
        btnAddRegra.addActionListener(this);          
        pnlSuperior.add(btAtributos);
        pnlSuperior.add(lblEscolhaChave);
        pnlInferior.add(btnProsseguir);
        btnProsseguir.setVisible(false);
        pn = new JScrollPane(pnlCentral);
        pn.setPreferredSize(new Dimension(820,200));
        pnlTodo.add(pnlSuperior, BorderLayout.NORTH);
        pnlTodo.add(pn, BorderLayout.CENTER);
        //pnlTodo.add(pnlCentral, BorderLayout.CENTER);
        pnlTodo.add(pnlInferior, BorderLayout.SOUTH);
        
        getContentPane().add(pnlTodo, "Center");
        setResizable(false);
        setAlwaysOnTop(true);
        pack();
        setLocation((InterfacePrincipal.getLarguraMonitor() - getContentPane().getWidth()) / 2, 100);
        
            
        

    
    //DEPOIS PREENCHER ELA COM AS OPCOES DE FATOS PARA ESCOLHER O FATO CHAVE
                   
        String resultado = new String();  
        resultado ="";
        Fatos objFatos = new Fatos();
 
       
                try {
                    objFatos.fatos=objFatos.fileToString("fatos.pl");
                    objFatos.fatos = objFatos.fatos.replaceAll(" ", "");//removendo espaçamentos
                    //System.out.println(objFatos.fatos);
                } catch (IOException ex) {
                    Logger.getLogger(GUI_InferenceTerminal.class.getName()).log(Level.SEVERE, null, ex);
                }
       
        fatosSeparados=objFatos.getFatosSeparados(objFatos.fatos);
        nomesFatos=objFatos.getNomesFatos(fatosSeparados);
        nomesFatos=removeRepetidos(nomesFatos);
          for (int i = 0; i < nomesFatos.length; i++) {
            resultado = resultado+nomesFatos[i]+"\n";               
           }
        //txtPane1.setText(resultado);
        //txtPane1.setVisible(false);
        //pnlCentral.remove(txtPane1);
        pnlCentral.removeAll();
        setIdentificaFatos(nomesFatos);//gera os radioButtons
        fatoBase1v1=objFatos.getFatoPrincipal(fatosSeparados, "base");
        fatoBase1v2=objFatos.getFatoPrincipal(fatosSeparados, "modificado");
        fatoBase1=fatoBase1v1+","+fatoBase1v2;
        setVisible(true);
}



    
    @Override
    public void actionPerformed(ActionEvent e) {
        int contador = 0;
       if (e.getSource() == btAtributos) {

  

       }else if(e.getSource() == btnProsseguir){
            for (JRadioButton item : fatosChave) {
                    if (item.isSelected()) {
                        contador++;
                        chaveEscolhida=item.getName();
                    }
                }
                if (contador > 0) {
                   // this.moduloInferencia.setRegras(txtPane1.getText());
                   // this.moduloInferencia.setRegrasSelecionadas(regrasFiltradas);
                   // this.fechadoCorretamente = true;
                   // dispose();
                    
                    fatoBase2v1 = chaveEscolhida+"(Fb,"+chaveEscolhida.toUpperCase()+")";
                    fatoBase2v2 = chaveEscolhida+"(Fm,"+chaveEscolhida.toUpperCase()+")";
                    fatoBase2=fatoBase2v1+","+fatoBase2v2;
                    
                    //tenho que dar um jeito de passar a regraBase para o txtarea da tela anterior
                    
                    
                    if(moduloInferencia.getRegraBase()!="mesmo_elemento(Fb,Fm,"+chaveEscolhida.toUpperCase()+"):-"+fatoBase1+","+fatoBase2+"."){
                    moduloInferencia.setRegraBase("mesmo_elemento(Fb,Fm,"+chaveEscolhida.toUpperCase()+"):-"+fatoBase1+","+fatoBase2+"."); 
                    }
                    
                    //A regraBase será da forma:
                    //mesmo_elemento(Fb,Fm,CHAVE):-nomeFatoPrincipal(base,Fb),nomeFatoPrincipal(modificado,Fm),nomeCHAVE(Fb,CHAVE),nomeCHAVE(Fm,CHAVE).
                    //Esta é a regra básica que será utilizada nas outras e me garante que estamos falando do mesmo elemento nas duas versões do XML
                  
                    
                    //functor vai ser usado na composição de uma regra construída pelo usuário.
                    functorRegraBase="mesmo_elemento(Fb,Fm,"+chaveEscolhida.toUpperCase()+")";
                    btnProsseguir.setVisible(false);
                    lblEscolhaChave.setVisible(false);
                    pnlCentral.removeAll();

                    pnlCentral.setLayout(new BoxLayout(pnlCentral, WIDTH));
                    setPanelTerminal();
                    /*
                    //campo para dar nome a regra nova
                    campoNomeRegra= new JTextField();
                    campoNomeRegra.setSize( new Dimension(10, 40));// nem isso;
                    campoNomeRegra.setVisible(true);
                    //combo com as opções de retorno da regra
                    comboSaida = new JComboBox(nomesFatos);
                    comboSaida.setVisible(true);
                    //combo com o primeiro termo da regra
                    comboTermo1 = new JComboBox(getNomesDuplicados(nomesFatos));
                    comboTermo1.setVisible(true);                   
                    
                    
                    pnlCentral.add(campoNomeRegra);
                    pnlCentral.add(comboSaida);
                    pnlCentral.add(comboTermo1);
                    pnlCentral.validate();*/
                } else {
                    JOptionPane.showMessageDialog(this, "É preciso escolher o identificador chave do contexto", "Erro", JOptionPane.ERROR_MESSAGE);
                }  
                //sobrepõe tela de escolha do atributo chave (radio buttons)
                //pela tela com o terminal de construção de regras
                
                
       }else if(e.getSource() == btnFinalizar){
          if(campoNomeRegra.getText().isEmpty()){
              JOptionPane.showMessageDialog(this, "É preciso dar um nome à regra", "Erro", JOptionPane.ERROR_MESSAGE);
              campoNomeRegra.requestFocus();
          }if(comboSaida.getSelectedItem().equals("")){
              JOptionPane.showMessageDialog(this, "É preciso escolher o tipo de saída", "Erro", JOptionPane.ERROR_MESSAGE);
              comboSaida.requestFocus();    
          }else{ 
          String regraConst= montaRegraConstruida(campoNomeRegra.getText(),comboSaida.getSelectedItem().toString(),comboTermo1.getSelectedItem().toString(),comboOperador1.getSelectedItem().toString(),comboTermo2.getSelectedItem().toString(),comboTermo3.getSelectedItem().toString()  );
          moduloInferencia.addRegraMontada(regraConst);
          dispose();
          }
          
          //JOptionPane.showMessageDialog(this, regrasConstruidas.get(0), "Erro", JOptionPane.ERROR_MESSAGE);
       }else if(e.getSource() == btnAddRegra){
          if(campoNomeRegra.getText().isEmpty()){
              JOptionPane.showMessageDialog(this, "É preciso dar um nome à regra", "Erro", JOptionPane.ERROR_MESSAGE);
              campoNomeRegra.requestFocus();
          }if(comboSaida.getSelectedItem().equals("")){
              JOptionPane.showMessageDialog(this, "É preciso escolher o tipo de saída", "Erro", JOptionPane.ERROR_MESSAGE);
              comboSaida.requestFocus();
          }else{
          String regraConst= montaRegraConstruida(campoNomeRegra.getText(),comboSaida.getSelectedItem().toString(),comboTermo1.getSelectedItem().toString(),comboOperador1.getSelectedItem().toString(),comboTermo2.getSelectedItem().toString(),comboTermo3.getSelectedItem().toString()  );
          comboTermo3.removeAllItems();
          moduloInferencia.addRegraMontada(regraConst);
          for(int i=0;i<moduloInferencia.getRegrasMontadasStringVector().length;i++){
              comboTermo3.addItem(moduloInferencia.getRegrasMontadasStringVector()[i]);
          }
          
         comboTermo3.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
            if(comboTermo3.getSelectedItem()!=""){
               String saidaForcada = new String();
               saidaForcada = getArgumentosRegra(comboTermo3.getSelectedItem().toString())[0];//estas regras só possuem um argumento
               //vou forçar a saída da nova regra ser a mesma da regra selecionada no comboTermo3
               System.out.println(saidaForcada);
               comboSaida.setSelectedItem(saidaForcada.toLowerCase());
               comboSaida.setEnabled(false);
           }else{
               comboSaida.setSelectedItem("");
               comboSaida.setEnabled(true);
           }               
           }});
          
          
          //zerando o construtor
          comboTermo1.setSelectedItem("");
          comboTermo2.setSelectedItem("");
          comboTermo3.addItem("");
          comboTermo3.setSelectedItem("");
          comboSaida.setSelectedItem("");
          comboOperador1.setSelectedItem("");
          campoNomeRegra.setText("");
          comboTermo3.setEnabled(true);
       }
       }
    }
    
    public static String[] removeRepetidos (String[] array){
        String[] arrayInvertido = new HashSet<String>(Arrays.asList(array))  
                        .toArray(new String[0]);
        String[] arrayResult = new String[arrayInvertido.length];
         
         for (int i=0; i<arrayInvertido.length;i++){
             arrayResult[i]=arrayInvertido[arrayInvertido.length-i-1];
         }
         return arrayResult;
    }
    
   
     /**
     * Cria as caixas para a exibição dos fatos (somente os nomes) para montar os radioButtons
     * @param fatos
     * Recebe um vetor de String onde cada índice contém os fatos completos.
     * 
     */
    private void setIdentificaFatos(String[] fatos) {
        btAtributos.setVisible(false); 
        pnlCentral.setLayout(new BoxLayout(pnlCentral, WIDTH));
        ButtonGroup grupo = new ButtonGroup();
        fatosChave = new ArrayList<JRadioButton>();
            for (String fato : fatos) {
                JRadioButton radioItem = new JRadioButton(fato);
                radioItem.setName(fato);
                grupo.add(radioItem);
                fatosChave.add(radioItem);
                pnlCentral.add(radioItem);
            }
            btnProsseguir.setVisible(true);   
    }

      /**
     * Monta as opções dos combobox de termos (fato - v. Base / fato - v. Modificado)
     * @param fatos
     * 
     */   
    private String[]  getNomesDuplicados(String[] nomesFatos){
        String[] nomesDuplicados;
        ArrayList<String> listNomesDuplicados = new ArrayList<String>();
       
        for (int i=0; i< nomesFatos.length; i++) {
               listNomesDuplicados.add(nomesFatos[i]+" - v. Base");
               listNomesDuplicados.add(nomesFatos[i]+" - v. Modificado");
        }
       nomesDuplicados = (String[]) listNomesDuplicados.toArray(new String[listNomesDuplicados.size()]);         
        return nomesDuplicados;
    }

        private void setPanelTerminal() {
        if(!terminalSetado){//se for a primeira vez 

        campoNomeRegra = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        comboSaida = new javax.swing.JComboBox();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        comboTermo1 = new javax.swing.JComboBox();
        comboTermo3 = new javax.swing.JComboBox();
        comboTermo3.addActionListener(this);
        comboOperador1 = new javax.swing.JComboBox();
        comboTermo2 = new javax.swing.JComboBox();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jSeparator1 = new javax.swing.JSeparator();
        comboTermo3 = new javax.swing.JComboBox();
        comboOperador1.addItemListener(new ItemListener() {
         public void itemStateChanged(ItemEvent e) {
             if((comboOperador1.getSelectedItem().toString().indexOf("_"))>=0){ //somente os operadores de diferença tem esse simbolo ex.: elemento_excluido
                 comboTermo1.setEnabled(false);
                 comboTermo2.setEnabled(false);
                 comboTermo1.setSelectedItem("");
                 comboTermo2.setSelectedItem("");
             }else{
                 comboTermo1.setEnabled(true);
                 comboTermo2.setEnabled(true);                 
             }
        }
        });
        }
        terminalSetado = true;
          
        campoNomeRegra.setText("");
        

        jLabel1.setText("Nome da regra:");

        comboSaida.setModel(new javax.swing.DefaultComboBoxModel(nomesFatos));
        comboSaida.addItem("");
        comboSaida.setSelectedItem("");
        comboOperador1.setSelectedItem("");
        jLabel2.setText("Saída:");

        jLabel3.setText("é válido se");
        jLabel5.setText("e");

        comboTermo1.setModel(new javax.swing.DefaultComboBoxModel(getNomesDuplicados(nomesFatos)));
        comboTermo2.setModel(new javax.swing.DefaultComboBoxModel(getNomesDuplicados(nomesFatos)));
        comboTermo3.setModel(new javax.swing.DefaultComboBoxModel(moduloInferencia.getRegrasMontadasStringVector()));
        comboTermo1.addItem("");
        comboTermo2.addItem("");
        comboTermo3.addItem("");
        comboTermo3.setSelectedItem("");
        comboTermo2.setSelectedItem("");
        comboTermo1.setSelectedItem("");
        //comboTermo3.setEnabled(false);
        /*
        if(!(moduloInferencia.getRegrasMontadas().isEmpty())){//se há regras montadas, vou adicioná-las à combo
            ArrayList<String> regrasMontadas= moduloInferencia.getRegrasMontadasArray();
            Iterator it = regrasMontadas.iterator();
            while(it.hasNext()){
                item=it.next();
                comboTermo1.addItem(getNomeRegra(item.toString()));
                comboTermo2.addItem(getNomeRegra(item.toString()));
            }
            
        }*/
        
        comboOperador1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "maior", "menor", "e","igual","diferente","novo_elemento","elemento_excluido",""}));

        comboOperador1.setSelectedItem("");

        jLabel4.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        jLabel4.setForeground(new java.awt.Color(0, 0, 153));
        jLabel4.setText("Construtor de regra");

        btnFinalizar.setText("Salvar e finalizar construtor");
        btnAddRegra.setText("Salvar e criar mais regras");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(pnlCentral);
        
        pnlCentral.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addComponent(campoNomeRegra, javax.swing.GroupLayout.PREFERRED_SIZE, 123, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(4, 4, 4)
                        .addComponent(comboTermo1, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(comboOperador1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        
                        .addComponent(comboTermo2, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(comboTermo3, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE))

                
                    .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addComponent(comboSaida, javax.swing.GroupLayout.PREFERRED_SIZE, 108, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        //.addComponent(comboTermo3, javax.swing.GroupLayout.PREFERRED_SIZE, 108, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(btnAddRegra)
                        .addComponent(btnFinalizar))
                    .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel4)
                .addGap(4, 4, 4)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(campoNomeRegra, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3)
                    .addComponent(comboTermo1, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(comboOperador1, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                    
                    .addComponent(comboTermo2, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel5)
                    .addComponent(comboTermo3, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE))
                    
                .addGap(18, 18, 18)
                .addComponent(jLabel2)
                .addGap(5, 5, 5)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(comboSaida, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                    //.addComponent(comboTermo3, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnAddRegra, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnFinalizar, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(20, Short.MAX_VALUE))
        );
        //pnlCentral.add(layout);
        
        pnlCentral.validate();
        pnlCentral.setVisible(true);
    }
        
        /**
         * Monta a regra que é construída pelo terminal para que ela seja adicionada às regras carregadas e/ou para realizar consultas
         * @param nomeRegra
         * @param saida
         * @param termo1
         * @param operador
         * @param termo2
         * @return 
         */
        private String montaRegraConstruida(String nomeRegra, String saida, String termo1, String operador, String termo2, String termo3){
            String novaRegra = new String();
            String regraAuxiliar = new String();
            String termo1tratado = new String();
            String termo2tratado = new String();
            String termo3tratado = new String();
            String arg1termo1 = new String();
            String arg1termo2 = new  String();
            String regraSaida = new String();
            termo3tratado="";       
            regraAuxiliar="";
            novaRegra = "";
            

            
         if(operador.equals("novo_elemento")){
            //Montando as duas regras básicas para o operador
             
            // ex: existe_modificado(NOME):-	funcionario(modificado,Fm),	nome(Fm,NOME).
            existeModificado = "existe_modificado("+saida.toUpperCase()+"):-"+fatoBase1v2+","+saida+"(Fm,"+saida.toUpperCase()+").";
            // ex: existe_base(NOME):-	funcionario(modificado,Fb),	nome(Fb,NOME).
            existeBase = "existe_base("+saida.toUpperCase()+"):-"+fatoBase1v1+","+saida+"(Fb,"+saida.toUpperCase()+")."; 
            
            //novo_elemento(X):- existe_modificado(X),not(existe_base(X)).
            novaRegra=nomeRegra+"("+saida.toUpperCase()+"):- existe_modificado("+saida.toUpperCase()+"),not(existe_base("+saida.toUpperCase()+")).";
            
         }else if (operador.equals("elemento_excluido")){
            //Montando as duas regras básicas para o operador 
             
            // ex: existe_modificado(NOME):-	funcionario(modificado,Fm),	nome(Fm,NOME).
            existeModificado = "existe_modificado("+saida.toUpperCase()+"):-"+fatoBase1v2+","+saida+"(Fm,"+saida.toUpperCase()+").";
            // ex: existe_base(NOME):-	funcionario(modificado,Fb),	nome(Fb,NOME).
            existeBase = "existe_base("+saida.toUpperCase()+"):-"+fatoBase1v1+","+saida+"(Fb,"+saida.toUpperCase()+").";     
            
            //elemento_excluido(X):-existe_base(X),not(existe_modificado(X)).
            novaRegra=nomeRegra+"("+saida.toUpperCase()+"):- existe_base("+saida.toUpperCase()+"),not(existe_modificado("+saida.toUpperCase()+")).";
            
             
         }else{
            String[] termo1separado = termo1.split("\\-");
            //indice 0: nome do fato que compoe o termo
            //indice 1: v. Base OU v. Modificado
            String[] termo2separado = termo2.split("\\-");  
            
            //pegando o "Base" ou "Modificado"
            termo1separado[1]=termo1separado[1].substring(termo1separado[1].lastIndexOf(".")+2);
            termo2separado[1]=termo2separado[1].substring(termo2separado[1].lastIndexOf(".")+2);            
            
            //poderia ser Fm tb... tanto faz.. é só para retorno
            regraSaida=saida+"(Fb,"+saida.toUpperCase()+")";
            
            if(termo1separado[1].equals("Base")){
                arg1termo1="Fb";
            }else arg1termo1="Fm";
            
            if(termo2separado[1].equals("Base")){
                arg1termo2="Fb";
            }else arg1termo2="Fm";

            termo1separado[0]=termo1separado[0].replaceAll(" ", "");
            termo1separado[1]=termo1separado[1].replaceAll(" ", "");
            termo2separado[0]=termo2separado[0].replaceAll(" ", "");
            termo2separado[1]=termo2separado[1].replaceAll(" ", "");            
            
            //salario(Fb,SALARIOBase)
            termo1tratado=termo1separado[0]+"("+arg1termo1+","+termo1separado[0].toUpperCase()+termo1separado[1]+")";
            
            termo2tratado=termo2separado[0]+"("+arg1termo2+","+termo1separado[0].toUpperCase()+termo2separado[1]+")";
            
            
            if(operador.equals("e")){
                //nao faz nada
                regraAuxiliar="";
            }else if(operador.equals("maior")){
                // preciso adicionar uma regra do tipo SalarioB>SalarioM
                regraAuxiliar=termo1separado[0].toUpperCase()+termo1separado[1]+">"+termo1separado[0].toUpperCase()+termo2separado[1]+",";
                 
            }else if(operador.equals("menor")){
                // preciso adicionar uma regra do tipo SalarioB<SalarioM
                regraAuxiliar=termo1separado[0].toUpperCase()+termo1separado[1]+"<"+termo1separado[0].toUpperCase()+termo2separado[1]+",";
                
            }else if(operador.equals("igual")){
                regraAuxiliar=termo1separado[0].toUpperCase()+termo1separado[1]+"=="+termo1separado[0].toUpperCase()+termo2separado[1]+",";
            }else if(operador.equals("diferente")){
                regraAuxiliar=termo1separado[0].toUpperCase()+termo1separado[1]+"\\="+termo1separado[0].toUpperCase()+termo2separado[1]+",";
            }
            
            
            if(termo3!=""){
               termo3tratado=termo3.substring(0, termo3.indexOf(")")+1);
               novaRegra = nomeRegra+"("+saida.toUpperCase()+"):-"+functorRegraBase+","+termo1tratado+","+termo2tratado+","+regraAuxiliar+regraSaida+","+termo3tratado+"."; 
            }else{
            novaRegra = nomeRegra+"("+saida.toUpperCase()+"):-"+functorRegraBase+","+termo1tratado+","+termo2tratado+","+regraAuxiliar+regraSaida+".";}
            //System.out.println(novaRegra);        
            return novaRegra;
         }//fecha else do teste dos operadores novo_elemento ou elemento_excluido
         moduloInferencia.setRegraDiff(existeModificado+"\n"+existeBase);
         return novaRegra;
        }
        
             /**
     * Retorna o nome de um único fato regra.
     * @param um fato
     * @return
     */
    public String getNomeRegra(String fato) {
        String nomeFato = "";

        int indiceParenteses = fato.indexOf("(");
        nomeFato = fato.substring(0, indiceParenteses);

        return nomeFato;
    }
     
        /**
     * Retorna os argumentos de uma regra passada para a função
     * @param regra
     * A regra completa, com o nome e os argumentos.
     * @return
     * Um argumento da regra recebida é representado em cada índice do vetor.
     */
    public String[] getArgumentosRegra(String regra) {
        int idxAbreParenteses = regra.indexOf("(");
        int idxFechaParenteses = regra.indexOf(")");
         String regraTemp = regra;
             String[] argumentos = regra.substring(idxAbreParenteses + 1, idxFechaParenteses).split(",");        
        return argumentos;
    }


        
}
